LINQ использует DataRelations для оптимизации соединений?

Вы на самом деле не прикрепили функцию add() к MyObjectFactory. Попробуйте что-то вроде этого:

describe("The launchTask function", () => {
    let spyObj;
    beforeEach(() => {
        global.external.MyObjectFactory= jasmine.any(Function);
        spyObj = jasmine.createSpyObj(["add"]);
        spyOn(global.external, 'MyObjectFactory').and.returnValue(spyObj);
    });
    it("Scene 1", () => {
        launchTask(123);
        expect(global.external.MyObjectFactory).toHaveBeenCalledWith("INDEXED");
        expect(spyObj.add).toHaveBeenCalledWith(123);
    });
});
6
задан Robert Rossney 22 December 2008 в 23:32
поделиться

3 ответа

Я так не думаю. В этом случае LINQ к Объектам будет, вероятно, просто рассматривать эти две стороны как регулярные счетные объекты и делать соединение вручную (не смотря на DataRelation).

2
ответ дан 17 December 2019 в 02:34
поделиться

Это - explaination: http://msdn.microsoft.com/en-us/library/bb386969.aspx

Но в Вашем примере выше Вы говорите linq об отношениях отцов и детей с синтаксисом "СОЕДИНЕНИЯ". Я рекомендовал бы сделать набор данных со строгим контролем типов, если это возможно, и все отношения и присоединение будут обработаны для Вас.

1
ответ дан 17 December 2019 в 02:34
поделиться

Рытье вокруг в Отражателе, казалось, не дало признака, что LINQ использует DataRelations, но что код ужасно трудно для чтения. Таким образом, я записал немного теста производительности, и если нет что-то немое о тесте, который я пропустил, результаты являются довольно категоричными: нет, LINQ не использует DataRelations, и GetChildRows () к проекту присоединился к строкам. Если Вы хотите выполнить итерации по дочерним строкам, необходимо сформулировать запрос LINQ для вызова GetChildRows () явно. И никакой подход не в какой-либо степени так же производителен как написание кода, которое выполняет итерации по массиву, возвращенному GetChildRows ().

Довольно неудачный, потому что разница в производительности на крупном DataSets является достаточно значительной, что замена LINQ с явно реализованным кодом часто будет стоящей, который обычно не верен для LINQ.

Мой тестовый код ниже. Синхронизация повторения LINQ с помощью соединения остается тем же (приблизительно 580-590 мс на моей машине) независимо от того, создается ли DataRelation прежде или после него. Повторение LINQ, которое использует GetChildRows () берет приблизительно 280 мс,

Повторение непосредственно по GetChildRows () берет под миллисекундой. Это довольно удивительно мне - достаточно так, чтобы я предположил, что у меня была ошибка в коде, когда я сначала запустил тест. (Вот почему я выписываю количеству каждый раз - чтобы удостовериться, что циклы не были оптимизированы из существования компилятором.)

class Program
{
    static void Main(string[] args)
    {
        Stopwatch sw = new Stopwatch();
        DataSet ds = new DataSet();
        DataTable t1 = new DataTable();
        t1.Columns.Add(new DataColumn
                           {
                               ColumnName = "ID",
                               DataType = typeof (int),
                               AutoIncrement = true
                           });
        t1.PrimaryKey = new [] { t1.Columns["ID"]};
        ds.Tables.Add(t1);

        DataTable t2 = new DataTable();
        t2.Columns.Add(new DataColumn
        {
            ColumnName = "ID",
            DataType = typeof(int),
            AutoIncrement = true
        });
        t2.Columns.Add("ParentID", typeof(int));
        t2.PrimaryKey = new[] { t2.Columns["ID"] };
        ds.Tables.Add(t2);

        sw.Reset();
        sw.Start();
        PopulateTables(t1, t2);
        sw.Stop();
        Console.WriteLine("Populating tables took {0} ms.", sw.ElapsedMilliseconds);
        Console.WriteLine();

        var list1 = from r1 in t1.AsEnumerable()
                   join r2 in t2.AsEnumerable()
                       on r1.Field<int>("ID") equals r2.Field<int>("ParentID")
                   where r1.Field<int>("ID") == 1
                   select r2;

        sw.Reset();
        sw.Start();
        int count = 0;
        foreach (DataRow r in list1)
        {
            count += r.Field<int>("ID");
        }
        sw.Stop();
        Console.WriteLine("count = {0}.", count);
        Console.WriteLine("Completed LINQ iteration in {0} ms.", sw.ElapsedMilliseconds);
        Console.WriteLine();

        sw.Reset();
        sw.Start();
        ds.Relations.Add(new DataRelation("FK_t2_t1", t1.Columns["ID"], t2.Columns["ParentID"]));
        sw.Stop();
        Console.WriteLine("Creating DataRelation took {0} ms.", sw.ElapsedMilliseconds);

        sw.Reset();
        sw.Start();
        var list2 =
            from r1 in t1.AsEnumerable()
            from r2 in r1.GetChildRows("FK_t2_t1")
            where r1.Field<int>("ID") == 1
            select r2;

        count = 0;
        foreach (DataRow r in list2)
        {
            count += r.Field<int>("ID");
        }
        sw.Stop();
        Console.WriteLine("count = {0}.", count);
        Console.WriteLine("Completed LINQ iteration using nested query in {0} ms.", sw.ElapsedMilliseconds);
        Console.WriteLine();

        sw.Reset();
        sw.Start();
        DataRow parentRow = t1.Select("ID = 1")[0];
        count = 0;
        foreach (DataRow r in parentRow.GetChildRows("FK_t2_t1"))
        {
            count += r.Field<int>("ID");
        }
        sw.Stop();
        Console.WriteLine("count = {0}.", count);
        Console.WriteLine("Completed explicit iteration of child rows in {0} ms.", sw.ElapsedMilliseconds);
        Console.WriteLine();

        Console.ReadLine();
    }

    private static void PopulateTables(DataTable t1, DataTable t2)
    {
        for (int count1 = 0; count1 < 1000; count1++)
        {
            DataRow r1 = t1.NewRow();
            t1.Rows.Add(r1);
            for (int count2 = 0; count2 < 1000; count2++)
            {
                DataRow r2 = t2.NewRow();
                r2["ParentID"] = r1["ID"];
                t2.Rows.Add(r2);
            }
        }
    }
} 
3
ответ дан 17 December 2019 в 02:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: