比较 ADO.NET LINQ to Entities 查询中的通用类型属性
Comparing Generic Type Properties in ADO.NET LINQ to Entities Queries
目标
我正在尝试比较 ADO.NET 的 LINQ to Entities 中两种泛型类型的主键。诀窍是,我无法显式比较 LINQ 查询中的属性,因为我使用的是泛型类型。因此,我必须从两个对象中动态检索 属性 的值以便比较它们。
虽然我可以在应用程序端手动遍历数据库中的每一行(我当前的生产方法),但我仍然更喜欢使用 LINQ 直接从数据库中检索。我想这只会让事情变得更简单。
问题
当尝试使用自定义帮助程序或与实体本身不直接相关的任何内容时,LINQ 查询因不受支持而失败。据我了解,当使用 'LINQ to Entities' 时,实际的 LINQ 查询是使用 SQL 执行的。正因为如此,我对如何处理条件非常有限。
免责声明
这不是我问如何在 LINQ 查询中使用方法。我现在概述的大部分内容或多或少会为任何未来的访问者服务同样question/issue。
我知道不可能按照我尝试的方式处理这个问题。我的问题是是否有一种创造性的方式来处理使用泛型类型的 LINQ to Entities 查询。我敢肯定答案是“这不可能”,但我想获得有关该主题的更多专业知识。也许有人以前尝试过。
异常
System.NotSupportedException: 'LINQ to Entities does not recognize the method
'Boolean CompareKeys[MyEntityType](System.Collections.Generic.List`1[System.String],
MyApp.DB.MyEntityType, MyApp.DB.MyEntityType)' method,
and this method cannot be translated into a store expression.'
动作
private static void MergeEntityListToDB<T>(List<T> list)
{
var primaryKeys = new List<string>() { "MyEntityTypeID" };
foreach (var row in list)
{
T ExistingRecord = dbRows
.Where(x => CompareKeys(primaryKeys, row, x)).FirstOrDefault();
// Remaining Logic
}
}
帮手
private static bool CompareKeys<T>(List<string> PKs, T obj1, T obj2)
{
foreach (var key in PKs)
{
var val1 = obj1.GetType().GetProperty(key).GetValue(obj1, null).ToString();
var val2 = obj2.GetType().GetProperty(key).GetValue(obj2, null).ToString();
if (val1 != val2)
return false;
}
return true;
}
我认为您需要结合 LINQ 动态查询和可能的 LINQKit 来实现您的目标。 EF(和 LINQ to SQL)无法将反射转换为 SQL 以查询数据库。
目标
我正在尝试比较 ADO.NET 的 LINQ to Entities 中两种泛型类型的主键。诀窍是,我无法显式比较 LINQ 查询中的属性,因为我使用的是泛型类型。因此,我必须从两个对象中动态检索 属性 的值以便比较它们。
虽然我可以在应用程序端手动遍历数据库中的每一行(我当前的生产方法),但我仍然更喜欢使用 LINQ 直接从数据库中检索。我想这只会让事情变得更简单。
问题
当尝试使用自定义帮助程序或与实体本身不直接相关的任何内容时,LINQ 查询因不受支持而失败。据我了解,当使用 'LINQ to Entities' 时,实际的 LINQ 查询是使用 SQL 执行的。正因为如此,我对如何处理条件非常有限。
免责声明
这不是我问如何在 LINQ 查询中使用方法。我现在概述的大部分内容或多或少会为任何未来的访问者服务同样question/issue。 我知道不可能按照我尝试的方式处理这个问题。我的问题是是否有一种创造性的方式来处理使用泛型类型的 LINQ to Entities 查询。我敢肯定答案是“这不可能”,但我想获得有关该主题的更多专业知识。也许有人以前尝试过。
异常
System.NotSupportedException: 'LINQ to Entities does not recognize the method
'Boolean CompareKeys[MyEntityType](System.Collections.Generic.List`1[System.String],
MyApp.DB.MyEntityType, MyApp.DB.MyEntityType)' method,
and this method cannot be translated into a store expression.'
动作
private static void MergeEntityListToDB<T>(List<T> list)
{
var primaryKeys = new List<string>() { "MyEntityTypeID" };
foreach (var row in list)
{
T ExistingRecord = dbRows
.Where(x => CompareKeys(primaryKeys, row, x)).FirstOrDefault();
// Remaining Logic
}
}
帮手
private static bool CompareKeys<T>(List<string> PKs, T obj1, T obj2)
{
foreach (var key in PKs)
{
var val1 = obj1.GetType().GetProperty(key).GetValue(obj1, null).ToString();
var val2 = obj2.GetType().GetProperty(key).GetValue(obj2, null).ToString();
if (val1 != val2)
return false;
}
return true;
}
我认为您需要结合 LINQ 动态查询和可能的 LINQKit 来实现您的目标。 EF(和 LINQ to SQL)无法将反射转换为 SQL 以查询数据库。