我在读完this question之后想知道......他有这段代码:
public static T FindOrCreate<T>(this Table<T> table, Func<T, bool> find)
where T : new()
{
T val = table.FirstOrDefault(find);
if (val == null)
{
val = new T();
table.InsertOnSubmit(val);
}
return val;
}
是否可以将该新项目作为另一个Func发送?我的意思是,当然会。但是,那已经创造了吗?或者当你真正运行Func时它会先创建吗?让我们说你有这个:
public static T FindOrCreate<T>(this Table<T> table, Func<T, bool> find, Func<T> replacement)
where T : new()
{
T val = table.FirstOrDefault(find);
if (val == null)
{
val = replacement();
table.InsertOnSubmit(val);
}
return val;
}
然后这样做:
var invoiceDb = ctx.Invoices.FindOrCreate(a => a.InvoicerId == InvoicerId
&& a.Number == invoiceNumber,
() => new Invoice());
invoiceDb.Number = invoiceNumber;
如果找到该发票,是否已创建新的发票?或者直到该函数被实际调用,该代码是否运行?或者它是如何工作的?
答案 0 :(得分:1)
replacement
中的代码在实际调用该函数之前不会运行,并且在表中发现该值丢失。
顺便说一句,如果按照规定实现这一点,这是完全合理的 - 您可能希望从函数中删除“where T : new()
”约束,因为它不再是必需的;你给它提供了有关如何明确地构建一个的所有信息。
答案 1 :(得分:1)
在这种情况下,你传递一个代表,所以
() => new Invoice()
直到才会调用代码
val = replacement();
线
答案 2 :(得分:0)
不,不会创建新发票。 Func只是一个委托,所以当你创建lambda :()=&gt;新的Invoice()与实现这一点几乎相同:
public Invoice Create()
{
return new Invoice();
}
并将委托传递给Create方法。只有当您实际执行委托(“创建”功能)时,该代码才会实际运行,从而创建发票。