Linq和Guid的匿名类型

dex*_*ter 8 c# linq guid enumerable

我有一个简单的表:

ID | 值

当我这样做:

var sequence = from c in valuesVault.GetTable()
               select new {RandomIDX = Guid.NewGuid(), c.ID, c.Value};
Run Code Online (Sandbox Code Playgroud)

投影中的每个元素都具有相同guid的值...我如何编写这个以便为投影中的每个元素获得不同的随机guid值?

编辑

澄清这个问题.该GetTable()方法仅调用此:

        return this.context.GetTable<T>();
Run Code Online (Sandbox Code Playgroud)

其中this.contenxt是类型为T的DataContext.

itteration完成,因为它总是完成,没有什么花哨的:

     foreach (var c in seq) 
     {
          Trace.WriteLine(c.RandomIDX + " " + c.Value);
     }
Run Code Online (Sandbox Code Playgroud)

输出:

bf59c94e-119c-4eaf-a0d5-3bb91699b04d What is/was your mother's maiden name?
bf59c94e-119c-4eaf-a0d5-3bb91699b04d What was the last name of one of your high school English teachers?
bf59c94e-119c-4eaf-a0d5-3bb91699b04d In elementary school, what was your best friend's first and last name?
Run Code Online (Sandbox Code Playgroud)

编辑2 使用linq2Sql提供程序框.我在它周围构建了一些泛型包装器,但它们不会改变代码中的IQuaryable或IEnumerable函数的方式.

Mik*_*erg 6

下面是什么valuesVault.GetTable()

您可能有一个Linq提供程序,如Linq 2 SQL.

这意味着它valuesVault.GetTable()的类型IQueryable反过来意味着整个查询成为一个表达式.

表达式是已定义但尚未执行的查询.

sequence迭代时,使用Linq提供程序执行查询,Linq提供程序和它必须执行的步骤之一是执行此表达式:Guid.NewGuid().大多数Linq提供程序无法将该表达式传递给基础源(SQL Server不知道如何处理它),因此它会执行一次,执行结果将返回结果的其余部分.

你可以做的是通过调用或方法强制valuesVault.GetTable()表达式成为一个集合.这将执行表达式并返回表示内存中集合的表达式..ToList().ToArray()IEnumerable

对a执行查询时IEnumerable,执行不会传递给Linq提供程序,而是由.NET运行时执行.

在您的情况下,这意味着表达式Guid.NewGuid()可以正确执行.

试试这个:

var sequence = from c in valuesVault.GetTable().ToArray()
               select new {RandomIDX = Guid.NewGuid(), c.ID, c.Value};
Run Code Online (Sandbox Code Playgroud)

注意那里的.ToArray().这将使声明IQueryable变为IEnumerable,并将改变其行为.

  • 是啊; 实际上现在你提到它,鉴于他正在做什么,AsEnumerable会比ToList或ToArray更好! (2认同)