gpt4 book ai didi

c# - 解决 LINQ to Entities 不识别方法的方法?

转载 作者:太空宇宙 更新时间:2023-11-03 11:02:24 24 4
gpt4 key购买 nike

我有一个我一直在使用的针对 IEnumerable 的方法,没问题。但是我也想开始将它用于 IQueryable。但是,我目前使用的方式无法正常工作,因为它会尝试对数据库执行我的方法。

情况如下。如果从中选择的值为 null 或属性的 Id 和 Name(如果存在),我希望我选择的对象的属性为 null。例如:

var foos = FooRepository.All().Select(s => new FooBrief()
{
Id = s.Id,
Customer = SimpleData.To(s.Customer, m => m.Id, m => m.Name)
});

SimpleData.To 看起来像:

public class SimpleData
{
public int Id { get; set; }
public string Name { get; set; }

public static SimpleData To<T>(T t, Func<T, int> id, Func<T, string> name) where T : class
{
if (t != null)
{
return new SimpleData { Id = id(t), Name = name(t) };
}
return null;
}
}

有什么方法可以在允许它对数据库执行的同时获得这种行为?

注意:由于我代码中其他地方的原因,我无法使用 .ToList()。我可能会在稍后添加额外的过滤

最佳答案

最简单的方法是使用 AsEnumerable 在数据库 之外执行选择:

var foos = FooRepository.All()
.Select(x => new { Id = x.Id,
CustomerId = x.Customer.Id,
CustomerName = x.Name })
.AsEnumerable()
.Select(s => new FooBrief {
Id = s.Id,
Customer = new SimpleData {
Id = s.CustomerId,
Name = s.CustomerName
}
});

第一个Select 只是为了确保数据库查询只提取所需的字段。如果你真的还想使用你的 SimpleData.To 方法:

// Outdented to avoid scrolling
var foos = FooRepository.All()
.Select(x => new { Id = x.Id,
CustomerId = x.Customer.Id,
CustomerName = x.Name })
.AsEnumerable()
.Select(s => new FooBrief {
Id = s.Id,
Customer = SimpleData.To(s,
s => s.CustomerId,
s => s.CustomerName)
});

关于c# - 解决 LINQ to Entities 不识别方法的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17216542/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com