我一直试图将一段相当基本的SQL代码转换成Lamda或Linq,但我无处可去。这是SQL查询:
SELECT * FROM Form a
INNER JOIN FormItem b ON a.FormId = b.FormId
INNER JOIN FormFee c ON a.FormId = c.FormId
INNER JOIN FeeType d ON c.FeeTypeId = d.FeeTypeId
WHERE b.StatusId = 7
我试过了,但它并没有做我想做的事。
public Form GetFormWithNoTracking(int id)
{
return ObjectSet
.Where(x => x.FormId == id &&
(x.FormItem.Any(di => di.StatusId == (short)Status.Paid)))
.AsNoTracking()
.FirstOrDefault();
}
我尝试仅返回FormItem
为StatusId
的{{1}}行。但是,以上全部归还。我知道Paid
会检查是否有匹配以及是否全部返回,因此在这种情况下,对于此表单,我的数据确实包含.Any()
StatusId
的项目以及一些Paid
未支付的项目,因此它会将所有项目全部收回。
答案 0 :(得分:1)
var query = (from a in ObjectSet.FormA
join b in ObjectSet.FormB on a.field equals b.field
where b.StatusId = 7
select new { a, b})
您可以使用相同的逻辑加入休息。
答案 1 :(得分:0)
这应该是你要求的:
Form
FormId = id
FormItems
StatusId = Paid
醇>
public IEnumerable<FormItem> GetFormWithNoTracking(int id)
{
return ObjectSet
.SingleOrDefault(x => x.FormId == id)
.Select(f => f.FormItem
.Where(di => di.StatusId == (short)Status.Paid))
.AsNoTracking();
}
如果您自己也需要Form
,则可能需要创建自定义类型(编辑:请参阅@Burk的答案)或返回Tuple<Form,IEnumerable<FormItem>>
,IEnumerable<Tuple<Form,FormItem>>
或任何适合您的类型最需要的是。
或者,您可以删除表单中的所有非付费项目。
public Form GetFormWithNoTracking(int id)
{
var form = ObjectSet
.SingleOrDefault(x => x.FormId == id)
.AsNoTracking();
var nonPaid = form.Select(f => f.FormItem
.Where(di => di.StatusId != (short)Status.Paid)).ToList();
foreach(FormItem item in nonPaid)
form.FormItem.Remove(item);
return form;
}