C# 获取修改对象的LINQ表达式
我有一个地址列表,而地址定义如下:C# 获取修改对象的LINQ表达式,c#,linq,lambda,C#,Linq,Lambda,我有一个地址列表,而地址定义如下: public class Address { public int Id { get; set; } public string Name { get; set; } public DateTime ModifiedDate { get; set; } } 基于之前的调用,我有一个元组列表,而元组由地址id和修改日期组成 e.g. List<Tuple<int, DateTime>> 不幸的是,以下是不可能的
public class Address
{
public int Id { get; set; }
public string Name { get; set; }
public DateTime ModifiedDate { get; set; }
}
基于之前的调用,我有一个元组列表,而元组由地址id和修改日期组成
e.g. List<Tuple<int, DateTime>>
不幸的是,以下是不可能的:
异常:“LINQ to Entities无法识别方法'System.DateTime get_Item(Int32)'方法,此方法无法转换为存储表达式。”
addressList.Where(a=>Id.Contains(a.Id)&&dates[a.Id]
这个问题可以通过循环解决,但我正在寻找一个更优雅的解决方案
List<Address> modifiedAddressList = new List<Address>();
foreach (Address a in addressList)
{
if (a.ModifiedDate > dates[a.Id]) modifiedAddressList.Add(a);
}
List modifiedDressList=new List();
foreach(地址列表中的地址a)
{
如果(a.ModifiedDate>dates[a.Id])modifiedDressList。添加(a);
}
这里的问题是,LinqToEntities不了解您的字典,以及如何将其转换为数据库查询
您有几个选择:
addressList
.Where(a => ids.Contains(a.Id))
.AsEnumerable()
.Where(dates[a.Id] < a.ModifiedDate);
地址列表
.其中(a=>ids.Contains(a.Id))
.可计算的()
.其中(日期[a.Id]
这里的问题是,LinqToEntities不了解您的字典,以及如何将其转换为数据库查询
您有几个选择:
addressList
.Where(a => ids.Contains(a.Id))
.AsEnumerable()
.Where(dates[a.Id] < a.ModifiedDate);
地址列表
.其中(a=>ids.Contains(a.Id))
.可计算的()
.其中(日期[a.Id]
目前,您的应用程序中有一个包含一些信息的字典,数据库中有一些当前日期。为了比较这两个数据集,需要将两者放在同一位置。这意味着要么将字典中的信息转移到数据库中,要么在进行比较之前将数据库中的数据返回到应用程序中
如果要将数据发送到数据库,需要通过SQL完成;您的数据库不能只运行任何旧的C#代码,这正是您试图做的,也是它无法工作的原因
“更简单”的解决方案可能是做您似乎不太喜欢的事情,即从数据库中提取数据,然后在应用程序中对其进行过滤。另一种选择是将字典中的数据上传到临时表,然后将两个表连接在一起
如果您愿意,您可以用LINQ esk的方式执行第一个选项:
addressList.Where(a => ids.Contains(a.Id))
.AsEnumerable()
.Where(a => dates[a.Id] < a.ModifiedDate);
addressList.Where(a=>ids.Contains(a.Id))
.可计算的()
其中(a=>dates[a.Id]
AsEnumerable
调用将确保后续方法在应用程序中执行,而不是转换为SQL。Contains
检查可以转换为SQL中的IN子句,因此它应该在AsEnumerable
调用之前,这样它就在DB端完成了。目前,您的应用程序中有一个包含一些信息的字典,数据库中有一些当前日期。为了比较这两个数据集,需要将两者放在同一位置。这意味着要么将字典中的信息转移到数据库中,要么在进行比较之前将数据库中的数据返回到应用程序中
如果要将数据发送到数据库,需要通过SQL完成;您的数据库不能只运行任何旧的C#代码,这正是您试图做的,也是它无法工作的原因
“更简单”的解决方案可能是做您似乎不太喜欢的事情,即从数据库中提取数据,然后在应用程序中对其进行过滤。另一种选择是将字典中的数据上传到临时表,然后将两个表连接在一起
如果您愿意,您可以用LINQ esk的方式执行第一个选项:
addressList.Where(a => ids.Contains(a.Id))
.AsEnumerable()
.Where(a => dates[a.Id] < a.ModifiedDate);
addressList.Where(a=>ids.Contains(a.Id))
.可计算的()
其中(a=>dates[a.Id]
AsEnumerable
调用将确保后续方法在应用程序中执行,而不是转换为SQL。Contains
检查可以转换为SQL中的IN子句,因此它应该在AsEnumerable
调用之前,因此它在DB端完成。LINQ to Entities无法识别该方法。。。哪种方法?您忘记了在每个方法的末尾使用.ToList()Where@lazyberezovsky我想那是他的错误,是索引器日期[a.Id]@KingKing-yep,我也是。但他对异常最重要的部分置之不理:)@lazyberezovsky,底层方法是get_Item(Int32)
,就是这样:)LINQ-to-Entities不识别该方法。。。哪种方法?您忘记了在每个方法的末尾使用.ToList()Where@lazyberezovsky我想那是他的错误,是索引器日期[a.Id]@KingKing-yep,我也是。但他对异常最重要的部分置之不理:)@lazyberezovsky,底层方法是get_Item(Int32)
,就是这样:)很好的答案我真的很感激!你知道contains方法是否有一个极限吗?@Moo我相信有几千项。实际上,通常首先命中的是DB的限制。大多数数据库不支持包含超过2-5000项的IN子句。如果你超过了这个极限,你又会遇到同样的问题;您可以在应用程序中同时执行这两项操作(即将AsEnumerable
向上移动)或将该信息上载到临时表。回答得好,我非常感谢!你知道有没有限制吗
addressList.Where(a => ids.Contains(a.Id))
.AsEnumerable()
.Where(a => dates[a.Id] < a.ModifiedDate);